package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法    关键字：abstract
 * 类：只提供行为概念，没有具体实际行为
 *
 * 抽象类与面向对象--多态绝对关系
 * 使用多态完成抽象类的创建，抽象类本身无法创建对象，需要使用多态完成抽象类的创建
 *
 * 什么是使用抽象类？
 *复杂项目时，需要在不同类下实现不同的功能，首先抽象类【Android】
 *
 * 定义抽象类与抽象方法
 * 类：修饰符 abstract class 类名{}      ----毫无意义，必须结合抽象方法
 * 抽象方法：修饰符  abstract 返回值 方法名(参数); ----没有具体的实现
 *
 * 抽象类实例化：创建对象：抽象对象自身无法实例化
 *① 创建n个子类，继承抽象父类，子类一定实现抽象父类的所有抽象方法
 * ②使用面向对象：多态【向上造型】  抽象类 引用=new 【实现】子类();
 * 注意：抽象类一定发生重写，子类继承抽象父类，也可以叫做【实现类】
 *
 */
abstract class Animals{ //抽象类
    //抽象方法:没有具体的实现【代码块】---一定继承---一定多态性【造型】
    public abstract void say();
     //①定义由final修饰的抽象方法？  ×
   // public abstract void sleep();
    //②定义一个抽象的变量  ×
    //abstract int i=1;
    //③定义静态变量  √
    static int i=1;
    //④可以定义一个静态的抽象变量吗？×
   // static abstract int j=1;
    //⑤可以定义一个静态的抽象方法吗？【无实现 】 ×  静态抽象二选一
   // public static abstract void eat();
    //⑥可以定义静态方法吗？【无实现：空代码块】  √
    public static void eat(){};
    //⑤⑥总结：抽象方法/静态方法 ,方法定义：修饰符  static/abstract  返回值 方法名
    //⑦可以定义内部类：静态内部类 √
    static class Sos{}
    //⑧抽象类有构造器吗  √
    public Animals() {}
    //⑨抽象类存在普通的实现方法吗  √
    public void run(){}

}
//⑩抽象类可以继承抽象类吗    实现：两个抽象类
abstract class Thing extends Animals{
    public abstract void sleep();
}
//目的：两个抽象类中所有抽象方法---继承【子】抽象类




//实现类：实现抽象【父】类的方法---多个实现类--继承--抽象
class Person1 extends Animals{
    @Override
    public void say() {
        System.out.println("人");
    }
    //报错原因：完成重写

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法实现类：只提供抽象方法--必须由子类实现--多态【造型】
        Animals a=new Person1();
        a.say();  //向上造型--重写抽象父类的抽象对象【覆盖】
    }
}
